package com.cskaoyan;

import com.cskaoyan.annotation.WdAnnotation;
import com.cskaoyan.service.UserServiceImpl;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @author stone
 * @date 2022/12/16 23:44
 */
public class DemoExecution {

    public static void main(String[] args) throws Exception {
        // 获得UserServiceImpl的class可以如何做
        Class clazz1 = UserServiceImpl.class;

        UserServiceImpl userService = new UserServiceImpl();
        Class clazz2 = userService.getClass();

        Class clazz3 = Class.forName("com.cskaoyan.service.UserServiceImpl");
        //Class clazz4 = Class.forName("com.mysql.jdbc.Driver");
        // 类加载获得 → 略

        UserServiceImpl instance = (UserServiceImpl) clazz3.newInstance();

        // 获得类上的注解
        // 建议大家获得注解之前，先去判断是否包含这个注解，如果包含的话，再去获得
        // 健壮性
        if (clazz3.isAnnotationPresent(WdAnnotation.class)) {
            WdAnnotation declaredAnnotation = (WdAnnotation) clazz3.getDeclaredAnnotation(WdAnnotation.class);
            String[] value = declaredAnnotation.value();
            String location = declaredAnnotation.location();
            // 当你获得这个类的时候，就可以获得类上的注解，以及里面的属性值
            System.out.println(Arrays.asList(value));
            System.out.println(location);
        }

        // instance这个实例，它有一个成员变量叫host，它的这个实例的成员变量的值当前为null
        // 想要给这个成员变量赋值
        // 1、有提供setHost方法
        instance.setHost("李雷");
        // 2、反射通过Field来赋值
        Field field = clazz3.getDeclaredField("host");
        // 给哪一个对象的这个成员变量赋一个什么值 instance、field、"李雷雷"
        field.setAccessible(true);
        field.set(instance,"李雷雷");

        // 3、反射通过set方法来赋值
        //instance.setHost("李雷雷雷雷"); → 通过反射来实现
        // 方法是什么、实例是什么、给这个方法提供的参数是什么
        // 获得Method提供两类参数：方法名、参数的类型
        Method method = clazz3.getDeclaredMethod("setHost", String.class);
        // 使用某个对象执行该方法，并且传入对应的参数
        Object[] args1 = {"李雷雷雷雷"};
        Object invoke = method.invoke(instance, args1);// invoke就是执行这个方法的返回值
        System.out.println(1);
        // Gson
    }
}
